package pro.cherish.knowledgeutil.common.num;

import cn.hutool.core.util.NumberUtil;

import java.math.BigDecimal;

/**
 * @author 创建人：cherish
 * @version 版本号：V1.0
 * <p>
 * ***************************修订记录************************************
 * 2019-11-02 cherish 创建该类功能。
 * **********************************************************************
 * </p>
 * @ClassName 类名：NumberUtilExt
 * @Description 功能说明：
 * <p>
 * TODO
 * </p>
 * **********************************************************************
 * @date 创建日期： 2019-11-02 cherish
 */
public class NumberUtilExt extends NumberUtil {
    /**
     * 字符串转long
     * @param str 源字符串
     * 注意：为空则返回0L
     * @return
     */
    public static long toLong(final String str) {
        return toLong(str, 0L);
    }

    /**
     * 字符串转long
     * @param str 源字符串
     * @param defaultValue 默认值
     * @return
     */
    public static long toLong(final String str, final long defaultValue) {
        if (str == null) {
            return defaultValue;
        }
        try {
            return Long.parseLong(str);
        } catch (final NumberFormatException nfe) {
            return defaultValue;
        }
    }
    /**
     * 字符串转int
     * @param str 源字符串
     * @param defaultValue 默认值
     * @return
     */
    public static int toInt(final String str, final int defaultValue) {
        if(str == null) {
            return defaultValue;
        }
        try {
            return Integer.parseInt(str);
        } catch (final NumberFormatException nfe) {
            return defaultValue;
        }
    }
    /**
     * 字符串转int
     * @param str 源字符串
     * 注意：为空则返回0
     * @return
     */
    public static int toInt(final String str) {
        return toInt(str, 0);
    }

    /**
     * 判断BigDecimal对象是否为null，空则转BigDecimal.ZERO
     * @param bigDecimal
     * @return
     */
    public static BigDecimal nullToZero(BigDecimal bigDecimal){
        return bigDecimal == null ? BigDecimal.ZERO : bigDecimal;
    }

    /**
     * 循环加
     * 参数为null 时 默认为0
     * 为返回原值 请重新接收此对象
     * @param values 可变参数，循环加
     * @return
     */
    public static BigDecimal add(BigDecimal... values){
        BigDecimal result = BigDecimal.ZERO;
        for(BigDecimal value : values){
            if(value == null) {
                continue;
            }
            result = result.add(value);
        }
        return result;
    }

    /**
     * 循环减
     * 第一个参数为第一个计算元素
     * 参数为null 时 默认为0
     * 为返回原值 请重新接收此对象
     * @param values 可变参数，循环减
     * @return
     */
    public static BigDecimal subtract(BigDecimal... values){
        if(values == null || values.length == 0){
            return BigDecimal.ZERO;
        }
        BigDecimal result = values[0] == null ? BigDecimal.ZERO : values[0];
        for(int i = 1; i < values.length ; i++){
            if(values[i] == null) continue;
            result = result.subtract(values[i]);
        }
        return result;
    }
}
